package day06;

import java.util.Arrays;
import java.util.Scanner;

public class Test2 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String s1 = input.next();
        String s2 = input.next();
        System.out.println(checkInclusion(s1, s2));
    }

    /**
     * 给你两个字符串 s1 和 s2 ，写一个函数来判断 s2 是否包含 s1 的排列。如果是，返回 true ；否则，返回 false 。
     * 换句话说，s1 的排列之一是 s2 的 子串 。
     *
     * @param s1
     * @param s2
     * @return
     */
    public static boolean checkInclusion(String s1, String s2) {
/*        //滑动窗口，只要在窗口中，每个字符的数目和s1相同就行
        boolean flag = false;
        char[] str1 = s1.toCharArray();
        char[] str2 = s2.toCharArray();
        char[] temp = new char[s1.length()];
        if (str1.length == 1 && str2.length == 1) {
            if (str1[0] == str2[0]) {
                flag = true;
            }
        } else {
            for (int i = 0; i < s2.length() - 1; i++) {
                int num = 0;
                for (int j = 0, k = i; j < s1.length() && k < s2.length(); j++, k++) {
                    //有问题
                    temp[j] = str2[k];
                }
                //判断temp和str1之间字符数目
                Arrays.sort(temp);
                Arrays.sort(str1);
                for (int m = 0; m < temp.length; m++) {
                    if (temp[m] == str1[m]) {
                        num++;
                    }
                }
                if (num == s1.length()) {
                    flag = true;
                    break;
                }
            }
        }
        return flag;*/

/*        初始化将滑动窗口压满，取得第一个滑动窗口的目标值
        继续滑动窗口，每往前滑动一次，需要删除一个和添加一个元素*/
        int m = s1.length();
        int n = s2.length();
        if (m > n) {
            return false;
        }
        int[] cnt = new int[26];
        for (char c : s1.toCharArray()) {
            cnt[c - 'a']++;
        }
        int[] cur = new int[26];
        for (int i = 0; i < m; i++) {
            cur[s2.charAt(i) - 'a']++;
        }
        if (check(cnt, cur)) {
            return true;
        }
        for (int i = m; i < n; i++) {
            cur[s2.charAt(i) - 'a']++;
            cur[s2.charAt(i - m) - 'a']--;
            if (check(cnt, cur)) {
                return true;
            }
        }
        return false;
    }

    public static boolean check(int[] cnt1, int[] cnt2) {
        for (int i = 0; i < 26; i++) {
            if (cnt1[i] != cnt2[i])
                return false;
        }
        return true;
    }

    //https://leetcode.cn/problems/permutation-in-string/solution/an-zi-fu-hua-dong-ruo-bao-liao-lai-shi-s-h2xq/
}
